﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para frmConOrdCom.xaml
    /// </summary>
    public partial class frmConOrdCom : Window
    {
        CLSMAEPRVP MaePrv = new CLSMAEPRVP();
        CLSENCPPRP EncPprp = new CLSENCPPRP();
        CLSDETPPRP DetPprp = new CLSDETPPRP();
        DataTable dtEnc = new DataTable();
        DataTable dtDet = new DataTable();

        public frmConOrdCom()
        {
            InitializeComponent();
        }
        
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void txtCodPrv_TextChanged(object sender, TextChangedEventArgs e)
        {
            txtNomPrv.Text = "";
            txtContacto.Text = "";
            txtEmail.Text = "";
            txtTelefono.Text = "";
            dgEncPed.ItemsSource = null;
            dgDetPed.ItemsSource = null;
            dtEnc.Clear();
            dtDet.Clear();
        }

        private void txtCodPrv_LostFocus(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();//FJRF - Ejecutamos el procesar del encabazado de los datos
        }
        private void BtnProcesar_Click(object sender, RoutedEventArgs e)
        {
            PttV_Procesar();//FJRF - Ejecutamos el procesar del encabazado de los datos
        }
        protected void PttV_Procesar()
        {
            DataTable dt = new DataTable();
            if (!txtCodPrv.Text.Equals(""))
            {
                MaePrv.CODPRV_PRV = txtCodPrv.Text;
                if (MaePrv.existe())
                {
                    MaePrv.consultar();
                    txtNomPrv.Text = MaePrv.NOMPRV_PRV;
                    txtTelefono.Text = MaePrv.TELPRV_PRV;
                    txtContacto.Text = MaePrv.CONPRV_PRV;
                    txtEmail.Text = MaePrv.EMAIL_PRV;
                }
                else//FJRF - Si el cliente no existe hacemos lo siguien
                {
                    txtNomPrv.Text = "";//FJRF - Limpiamos los datos
                    txtTelefono.Text = "";//FJRF - Limpiamos los datos
                    txtContacto.Text = "";//FJRF - Limpiamos los datos
                    txtEmail.Text = "";//FJRF - Limpiamos los datos
                }
            }
            else//FJRF - Si el cliente no existe hacemos lo siguien
            {
                txtNomPrv.Text = "";//FJRF - Limpiamos los datos
                txtTelefono.Text = "";//FJRF - Limpiamos los datos

                txtContacto.Text = "";//FJRF - Limpiamos los datos
                txtEmail.Text = "";//FJRF - Limpiamos los datos
            }
            EjecutarSp_SP_INFRESORDCOM(txtCodPrv.Text, DtpFechaDesde.SelectedDate.Value.ToShortDateString(), DtpFechaHasta.SelectedDate.Value.ToShortDateString(), CboProcesarSoloPendientes.Text.Substring(0, 1));//FJRF - Ejecutamos el SP
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                //System.Windows.Forms.SendKeys.Send("{TAB}");
                KeyEventArgs e1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource,
                                 0, Key.Tab);
                e1.RoutedEvent = Keyboard.KeyDownEvent;
                InputManager.Current.ProcessInput(e1);
            }

            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void btnbuscar_Click(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            FRMbuscar frm = new FRMbuscar(MaePrv, "buscar", "Codigo", "NOMPRV_PRV", "Codigo");
            frm.ShowDialog();
            txtCodPrv.Text = frm.retorno;
            if (txtCodPrv.Text != "")
            {
                MaePrv.CODPRV_PRV = txtCodPrv.Text;
                if (MaePrv.existe())
                {
                    MaePrv.consultar();
                    txtNomPrv.Text = MaePrv.NOMPRV_PRV;
                    txtTelefono.Text = MaePrv.TELPRV_PRV;
                    txtContacto.Text = MaePrv.CONPRV_PRV;
                    txtEmail.Text = MaePrv.EMAIL_PRV;
                    EncPprp.CODPRV_EPP = txtCodPrv.Text;
                    dtEnc = EncPprp.ConsultaOrdenCompra();
                    dgEncPed.ItemsSource = dtEnc.DefaultView;
                }
                else
                {
                    txtNomPrv.Text = "";
                    txtCodPrv.Text = "";
                    txtContacto.Text = "";
                    txtTelefono.Text = "";
                    txtEmail.Text = "";
                }
            }
        }

        private void dgEncPed_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            try
            {
                string NroPed = ((DataRowView)dgEncPed.Items[dgEncPed.SelectedIndex]).Row["PEDIDO"].ToString();

                //FJRF - Buscamos la tabla que devuelve
                StrConsulta = "SELECT CODPRV_TMP AS PROVEEDOR,  NROPED_TMP AS PEDIDO,  CODMAT_TMP AS CODMAT,  NOMMAT_TMP AS MATERIAL,  CODCOL_TMP AS CODCOL,  NOMCOL_TMP AS COLOR,  CANPED_TMP AS PEDIDA,  CANREC_TMP AS RECIBIDA,  CANDES_TMP AS DESCARTADA,  CANMAS_TMP AS DEMAS,  CANPEN_TMP AS PENDIENTE FROM TMPINFRESPEDPRV1 WHERE NROPED_TMP = '" + NroPed + "' ";//FJRF - Hacemos la consulta de la tabla principal que devuelve, este SP retorna dos tablas pero la otra se consulta en otro proceso
                dtDet = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                dgDetPed.ItemsSource = dtDet.DefaultView;//FJRF - Cargamos los datos al grid
            }
            catch(Exception ex)
            {
                //FJRF - No hacemos nada
            }
        }
        private void dgDetPed_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            #region FJRF - Saber Fila y Columna indexada

            int IntColumnaIndexada, IntFilaIndexada;
            DependencyObject dep = (DependencyObject)e.OriginalSource;

            //Stepping through the visual tree
            while ((dep != null) && !(dep is System.Windows.Controls.DataGridCell))
            {
                dep = VisualTreeHelper.GetParent(dep);
            }

            //Is the dep a cell or outside the bounds of Window1?
            if (dep == null | !(dep is System.Windows.Controls.DataGridCell))
            {
                return;
            }
            else
            {
                System.Windows.Controls.DataGridCell cell = new System.Windows.Controls.DataGridCell();
                cell = (System.Windows.Controls.DataGridCell)dep;
                while ((dep != null) && !(dep is DataGridRow))
                {
                    dep = VisualTreeHelper.GetParent(dep);
                }

                if (dep == null)
                {
                    return;
                }
                int colindex = cell.Column.DisplayIndex;  //this returns COLUMN INDEX
                IntColumnaIndexada = colindex;

                DataGridRow row = dep as DataGridRow;
                System.Windows.Controls.DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as System.Windows.Controls.DataGrid;
                int rowindex = dataGrid.ItemContainerGenerator.IndexFromContainer(row); //this returns ROW INDEX

                IntFilaIndexada = rowindex;
            }
            #endregion

            if (IntColumnaIndexada == 7)//FJRF - Cuando la columna sea igual a cantidad recibida
            {
                String StrMaterial, StrColor, StrCodigoProveedor, StrNumeroPedido;//FJRF - Creamos las variables que contendran los datos que se enviaran al formulario
                FrmConsultarOrdenesDeCompra Frm = new FrmConsultarOrdenesDeCompra();//FJRF - Creamos una variable que instancia el formulario que vamos a llamar

                StrMaterial = ((DataRowView)dgDetPed.Items[dgDetPed.SelectedIndex]).Row["CODMAT"].ToString();//FJRF - Extraemos la materia prima 
                StrColor = ((DataRowView)dgDetPed.Items[dgDetPed.SelectedIndex]).Row["CODCOL"].ToString();//FJRF - Extraemos el color
                StrCodigoProveedor = ((DataRowView)dgDetPed.Items[dgDetPed.SelectedIndex]).Row["PROVEEDOR"].ToString();//FJRF - Extraemos el proveedor
                StrNumeroPedido = ((DataRowView)dgDetPed.Items[dgDetPed.SelectedIndex]).Row["PEDIDO"].ToString();//FJRF - Extraemos el numero de pedido

                Frm.TxtCodigoMaterial.Text = StrMaterial;//FJRF - Enviamos el material
                Frm.TxtCodigoColor.Text = StrColor;//FJRF - Enviamos el color
                Frm.TxtCodigoProveedor.Text = StrCodigoProveedor;//FJRF - Enviamos el codigo del proveedor
                Frm.TxtNumeroDePedido.Text = StrNumeroPedido;//FJRF - Enviamos el numero del pedido seleccionado

                Frm.ShowDialog();//FJRF - Llamamos el formulario
            }
        }
        private void btnImprimirTodo_Click(object sender, RoutedEventArgs e)
        {
            DataSet DsConsulta = new DataSet("dsConsultarOrdenesDeCompra");//FJRF - Usamos este DataSet para hacer consultas generales

            #region FJRF - CreamosElEncabezadoDeLaTabla
            DataTable DtEncabezado = new DataTable("TBLENCABEZADO");
            DtEncabezado.Columns.Add("STREMPRESA", System.Type.GetType("System.String"));
            DataRow DrNewRow = DtEncabezado.NewRow();
            DrNewRow["STREMPRESA"] = MDOgeneral.strEmpresaImprime;
            DtEncabezado.Rows.Add(DrNewRow);
            DtEncabezado.TableName = "TBLENCABEZADO";
            DsConsulta.Tables.Add(DtEncabezado);
            #endregion

            #region FJRF - ConsultamosLasTablasDelDetalle
            DtConsulta = new DataTable("TMPINFRESPEDPRV1Y2");

            StrConsulta = "SELECT T1.CODPRV_TMP, T1.NOMPRV_TMP, T1.NROPED_TMP, T1.FECPED_TMP, T1.ESTPED_TMP, T1.FECENT_TMP, T1.CANPED_TMP, T1.CANREC_TMP, T1.CANDES_TMP, T1.CANMAS_TMP, T1.CANPEN_TMP, ";
            StrConsulta = StrConsulta + "T2.CODMAT_TMP, T2.NOMMAT_TMP, T2.CODCOL_TMP, T2.NOMCOL_TMP, T2.CANPED_TMP AS CANPED_TMP_1, T2.CANREC_TMP AS CANREC_TMP_1, T2.CANDES_TMP AS CANDES_TMP_1, T2.CANMAS_TMP AS CANMAS_TMP_1, T2.CANPEN_TMP AS CANPEN_TMP_1 ";
            StrConsulta = StrConsulta + "FROM TMPINFRESPEDPRV T1, TMPINFRESPEDPRV1 T2 ";
            StrConsulta = StrConsulta + "WHERE T2.CODPRV_TMP = T1.CODPRV_TMP AND ";
            StrConsulta = StrConsulta + "T2.NROPED_TMP = T1.NROPED_TMP ";
            StrConsulta = StrConsulta + "ORDER BY T1.CODPRV_TMP, T1.NROPED_TMP, T2.CODMAT_TMP, T2.CODCOL_TMP ";

            DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos
            DtConsulta.TableName = "TMPINFRESPEDPRV1Y2";
            #endregion

            #region FJRF - ImprimimosElReporte
            DsConsulta.Tables.Add(DtConsulta);//FJRF - Enviamos la informacion al dataset del reporte
            produccion.reportes.Vista frm = new produccion.reportes.Vista();//FJRF - Instanciamos el reporte
            frm.reporte = @"reportes\rptInformeConsultarOrdenesDeCompra.rpt";//FJRF - Cargamos la estructura del reporte
            frm.ds = DsConsulta;//FJRF - Enviamos los datos al reporte
            frm.Show();//FJRF - Visualizamos el reporte
            #endregion
        }
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral
        
        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            DateTime DtFecha = DateTime.Now;//FJRF - Variable para manejar la fecha, se inicializa con el dia actual

            DtpFechaDesde.SelectedDate = DtFecha.AddDays(-30);//FJRF - Ponemos la fecha actual
            DtpFechaHasta.SelectedDate = DtFecha;//FJRF - ponemos 30 dias menos

            CboProcesarSoloPendientes.SelectedIndex = 0;//FJRF - Decimos que si buscar pendientes

            DtpFechaDesde.Focus();//FJRF - Enviamos el foco al objeto
        }

        private void dgEncPed_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        #region FJRF - PROCESOS ACTUALES 
        private void EjecutarSp_SP_INFRESORDCOM(String StrProveedor, String StrFechaInicial, String StrFechaFinal, String StrPendientes)//FJRF - Este procedimiento ejecuta un sp
        {
            String StrProvedorInicial, StrProveedorFinal;
            if (String.IsNullOrEmpty(StrProveedor) == true)
            {
                StrProvedorInicial = "   ";
                StrProveedorFinal = "zzz";
            }
            else
            {
                StrProvedorInicial = StrProveedor;
                StrProveedorFinal = StrProveedor; 
            }
            try
            {
                MDOgeneral.spComando.CommandText = "SP_INFRESORDCOM";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_prvini", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = StrProvedorInicial;
                MDOgeneral.spComando.Parameters.Add("pva_prvfin", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = StrProveedorFinal;

                MDOgeneral.spComando.Parameters.Add("pdt_desde", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(StrFechaInicial) ? "" : StrFechaInicial;
                MDOgeneral.spComando.Parameters.Add("pdt_hasta", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(StrFechaFinal) ? "" : StrFechaFinal;

                MDOgeneral.spComando.Parameters.Add("pva_solpen", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(StrPendientes) ? "" : StrPendientes;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();

                //FJRF - Buscamos la tabla que devuelve
                StrConsulta = "SELECT CODPRV_TMP AS CODPROV,  NOMPRV_TMP AS PROVEEDOR,  NROPED_TMP AS PEDIDO,  FECPED_TMP AS INICIAL,  FECENT_TMP AS ENTREGA,  ESTPED_TMP AS ESTADO,  CANPED_TMP AS PEDIDA,  CANREC_TMP RECIBIDA,  CANDES_TMP AS DESCARTADA,  CANMAS_TMP AS DEMAS,  CANPEN_TMP AS PENDIENTE FROM TMPINFRESPEDPRV ORDER BY CODPRV_TMP, NROPED_TMP";//FJRF - Hacemos la consulta de la tabla principal que devuelve, este SP retorna dos tablas pero la otra se consulta en otro proceso
                dtEnc = MdoGeneral.consulta(StrConsulta);//FJRF - Traemos los datos

                dgEncPed.ItemsSource = dtEnc.DefaultView;//FJRF - Cargamos los datos al grid

                if (dgEncPed.Items.Count > 0)
                {
                    btnImprimirTodo.Visibility = Visibility.Visible;
                }
                else
                {
                    btnImprimirTodo.Visibility = Visibility.Hidden;
                }
            }
            catch (Exception ex) { throw ex; }
        }
        #endregion

        private void dgEncPed_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDA" || strNombreColumna == "RECIBIDA" || strNombreColumna == "DESCARTADA" || strNombreColumna == "DEMAS" || strNombreColumna == "PENDIENTE")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();//FJRF - Alineamos la celda a la derecha
            }

            if (strNombreColumna == "INICIAL" || strNombreColumna == "ENTREGA")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "dd/MM/yyyy";
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

        }
        #region ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

        private void dgDetPed_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna == "PEDIDA" || strNombreColumna == "RECIBIDA" || strNombreColumna == "DESCARTADA" || strNombreColumna == "DEMAS" || strNombreColumna == "PENDIENTE")
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();//FJRF - Alineamos la celda a la derecha
            }
            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella
        }

        private void CboProcesarSoloPendientes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

    }
}
